/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.marcelo.agro.core;

import java.util.List;
import javax.swing.SwingWorker;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author marcelo
 *
 * Esta clase es para cargar datos en una tabla de manera asincrona, se basa en el objeto swing worker
 * Tiene un metodo abstracto que es getDatos() que debe ser implementado para cada tabla en particular
 * La idea es que el tableModel Sea implementado para cada tabla en particular,
 * en cada peticion el tableModel se resetea, y se le añaden nuevos Items
 * La idea de T es la de representar un Objeto del Tipo TableModel, pero una implementacion mas alta
 * La idea de V es la lista de Datos para la tabla V tiene Implementar un metodo especial que permita determinar la cantidad de columnas 
 * y como obtener los datos de cada columna
 * 
 */

public abstract class TablaEnBackground<T,V> extends SwingWorker<T,V> {
    
    Object tableModel;
        
    /**
     * Este metodo debe ser implementado para poder que tipos de datos seran los necesarios
     * para la tabla
     * @return 
     */
    public abstract T getDatos();
   

    @Override
    protected T doInBackground() throws Exception {    
        return getDatos();        
    }

    @Override
    protected void done() {
        try{
            
            ((DatosEnBackground) tableModel).getList().clear();
            ((DatosEnBackground) tableModel).getList().addAll((List)get());
            ((AbstractTableModel )tableModel).fireTableDataChanged();
            
//            else{
//                throw  new Exception("El table Model no esta inicializado");
//            }
        }
        catch (Exception ignore){}
    }

    public TablaEnBackground(Object tableModel) {
        this.tableModel = tableModel;        
    }
    
    
    
    public interface DatosEnBackground<V> {
        public List<V> getList();
    }
    
}
